package com.witker.common.util;

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

/**
 * 类型反射工具
 * Created by BOCAI on 2018/9/16 9:42.
 */
public class ClassReflectUtil {


    /**
     * 获取目标类型的公有属性
     * @param beanType 目标类型
     * @return 返回目标类型的属性名与属性元信息的字典集合
     */
    public static Map<String, Field> getFields(Class<?> beanType){
        Map<String, Field> result = new HashMap<>();

        return result;
    }

    /**
     * 获取目标类型的私有或受保护属性
     * @param beanType 目标类型
     * @return 返回目标类型的属性名与属性元信息的字典集合
     */
    public static Map<String, Field> getDeclaredFields(Class<?> beanType){
        Map<String, Field> result = new HashMap<>();
        Field[] fields = beanType.getDeclaredFields();
        int length = fields.length;

        for( int index = 0 ; index < length ; index++ ){
            result.put(fields[index].getName(), fields[index]);
        }

        return result;
    }


    /**
     * 获得类的参数化类型
     * @param type 类型
     * @return 返回参数化类型数组
     */
    public static Type[] getParameterizedType(Class<?> type){
        ParameterizedType parameterizedType = (ParameterizedType)type.getGenericSuperclass();
        Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
        return actualTypeArguments;
    }
}
